import tkinter as tk
from tkinter import messagebox
import re

def text_statistics_gui():
    # 创建主窗口
    root = tk.Tk()
    root.title("文本统计工具（含代码行统计）")
    root.geometry("700x500")
    root.resizable(False, False)

    # 初始化统计变量
    str_count = tk.IntVar(value=0)     # 字符数
    word_count = tk.IntVar(value=0)    # 单词数
    sen_count = tk.IntVar(value=0)     # 句子数
    code_valid_lines = tk.IntVar(value=0)  # 有效代码行
    code_empty_lines = tk.IntVar(value=0)  # 空行数
    code_comment_lines = tk.IntVar(value=0)# 注释行数

    file_path = r"D:\code\two\拓展功能测试.txt"

    def count_all_dimensions():
        try:
            with open(file_path, "r", encoding="utf-8") as fp:
                content = fp.read()  # 读取全部内容，便于统一处理
                lines = content.splitlines()  # 按行分割（用于代码行统计）

                # 1. 字符数统计：排除换行符，统计所有可见字符
                content_clean = content.replace('\n', '').replace('\r', '')
                char_total = len(content_clean)

                # 2. 单词数统计：匹配纯字母单词（排除标点、符号）
                words = re.findall(r'\b[a-zA-Z]+\b', content_clean)
                final_word_count = len(words)

                # 3. 句子数统计：匹配以.?!结尾的句子（排除缩写点）
                sentences = re.split(r'(?<!\w\.)(?<=\.|\?|!)\s*', content_clean.strip())
                final_sen_count = len([s for s in sentences if s.strip()])

                # 4. 代码行统计（逐行）
                valid_code = 0
                empty_line = 0
                comment_line = 0
                for line in lines:
                    stripped_line = line.strip()
                    if len(stripped_line) == 0:
                        empty_line += 1
                    elif stripped_line.startswith(("#", "//")):
                        comment_line += 1
                    else:
                        valid_code += 1

                # 更新变量到界面
                str_count.set(char_total)
                word_count.set(final_word_count)
                sen_count.set(final_sen_count)
                code_valid_lines.set(valid_code)
                code_empty_lines.set(empty_line)
                code_comment_lines.set(comment_line)

        except FileNotFoundError:
            messagebox.showerror("错误", f"文件未找到，请检查路径：{file_path}")
        except Exception as e:
            messagebox.showerror("错误", f"读取文件失败：{str(e)}")

    # 程序启动时自动统计
    def auto_count():
        count_all_dimensions()

    # 标题
    tk.Label(root, text="文本统计工具（含代码行统计）", font=("微软雅黑", 14, "bold")).pack(pady=20)

    # 1. 文本基础统计框架（字符/单词/句子）
    text_frame = tk.Frame(root, bd=2, relief=tk.GROOVE, padx=20, pady=10)
    text_frame.pack(fill=tk.X, padx=50, pady=5)

    tk.Label(text_frame, text="拓展功能测试.txt 文本统计：", font=("微软雅黑", 11, "bold")).grid(row=0, column=0, columnspan=2, pady=5, sticky=tk.W)
    tk.Label(text_frame, text="字符数：", font=("微软雅黑", 10)).grid(row=1, column=0, padx=30, pady=3, sticky=tk.W)
    tk.Label(text_frame, textvariable=str_count, font=("微软雅黑", 10), width=15, bg="#e0e0e0").grid(row=1, column=1, pady=3, sticky=tk.W)
    tk.Label(text_frame, text="单词数：", font=("微软雅黑", 10)).grid(row=2, column=0, padx=30, pady=3, sticky=tk.W)
    tk.Label(text_frame, textvariable=word_count, font=("微软雅黑", 10), width=15, bg="#e0e0e0").grid(row=2, column=1, pady=3, sticky=tk.W)
    tk.Label(text_frame, text="句子数：", font=("微软雅黑", 10)).grid(row=3, column=0, padx=30, pady=3, sticky=tk.W)
    tk.Label(text_frame, textvariable=sen_count, font=("微软雅黑", 10), width=15, bg="#e0e0e0").grid(row=3, column=1, pady=3, sticky=tk.W)

    # 2. 代码行统计框架（有效行/空行/注释行）
    code_frame = tk.Frame(root, bd=2, relief=tk.GROOVE, padx=20, pady=10)
    code_frame.pack(fill=tk.X, padx=50, pady=10)

    tk.Label(code_frame, text="拓展功能测试.txt 代码行统计：", font=("微软雅黑", 11, "bold")).grid(row=0, column=0, columnspan=2, pady=5, sticky=tk.W)
    tk.Label(code_frame, text="有效代码行：", font=("微软雅黑", 10)).grid(row=1, column=0, padx=30, pady=3, sticky=tk.W)
    tk.Label(code_frame, textvariable=code_valid_lines, font=("微软雅黑", 10), width=15, bg="#e0e0e0").grid(row=1, column=1, pady=3, sticky=tk.W)
    tk.Label(code_frame, text="空行数：", font=("微软雅黑", 10)).grid(row=2, column=0, padx=30, pady=3, sticky=tk.W)
    tk.Label(code_frame, textvariable=code_empty_lines, font=("微软雅黑", 10), width=15, bg="#e0e0e0").grid(row=2, column=1, pady=3, sticky=tk.W)
    tk.Label(code_frame, text="注释行数：", font=("微软雅黑", 10)).grid(row=3, column=0, padx=30, pady=3, sticky=tk.W)
    tk.Label(code_frame, textvariable=code_comment_lines, font=("微软雅黑", 10), width=15, bg="#e0e0e0").grid(row=3, column=1, pady=3, sticky=tk.W)

    # 操作按钮
    btn_frame = tk.Frame(root, pady=15)
    btn_frame.pack()
    tk.Button(btn_frame, text="刷新统计", command=auto_count, width=12).grid(row=0, column=0, padx=20)
    tk.Button(btn_frame, text="退出", command=root.quit, width=12).grid(row=0, column=1, padx=20)

    # 启动时自动统计
    auto_count()

    root.mainloop()

if __name__ == "__main__":
    text_statistics_gui()